# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建原始模板，添加格式指令和严格的JSON格式要求
prompt_template = """不要展示推理过程。
您是一位专业的鲜花店文案撰写员。请按照以下要求为售价为 {price} 元的 {flower_name} 提供吸引人的简短描述：
{format_instructions}
请严格按照上述JSON格式输出，不要添加任何额外的文字或解释。"""

from langchain.output_parsers import StructuredOutputParser, ResponseSchema
response_schemas = [
    ResponseSchema(name="description", description="鲜花的描述文案"),
    ResponseSchema(name="reason", description="问什么要这样写这个文案")
]
# 结构化输出解析器（Structured Output Parser）
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()

prompt = PromptTemplate.from_template(prompt_template, partial_variables={"format_instructions": format_instructions})

# 解耦 promp和 model
from langchain_ollama import ChatOllama
llm = ChatOllama(
    model="deepseek-r1:8b",
    # model="gemma3:1b",
    base_url="http://localhost:11434",  # Ollama 服务地址
    temperature=0.7,  # 创造性程度
    num_predict=1024,  # 最大生成长度
    options={'stop': ['<think>', '</think>']} # 遇到这些标记就停止
)

import pandas as pd
df = pd.DataFrame(columns=['flower', 'price', 'description', 'reason'])

flowers=["白百合", "红玫瑰"]
prices = [100, 200]

for flower, price in zip(flowers, prices):
  input_promp = prompt.format(flower_name = flower,price = price)
  # print(input_promp)
  output = llm.invoke(input_promp)

  # 从AIMessage对象中提取文本内容
  try: 
    # print(output.content)
    parsed_output = output_parser.parse(output.content)
  except Exception as e:
    print(f"解析输出时出错: {str(e)}")
    exit(1)

  parsed_output['flower'] = flower 
  parsed_output['price'] = price 
  # 将解析后的输出添加到DataFrame中 
  df.loc[len(df)] = parsed_output
  # 打印字典
print("\n解析后的输出:", df.to_dict(orient='records'))
# 保存DataFrame到CSV文件
# df.to_csv("flowers_with_descriptions.csv", index=False)